//给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。 
//
// 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成
//部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。 
//
// 请注意，返回的 规范路径 必须遵循下述格式： 
//
// 
// 始终以斜杠 '/' 开头。 
// 两个目录名之间必须只有一个斜杠 '/' 。 
// 最后一个目录名（如果存在）不能 以 '/' 结尾。 
// 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。 
// 
//
// 返回简化后得到的 规范路径 。 
//
// 
//
// 示例 1： 
//
// 
//输入：path = "/home/"
//输出："/home"
//解释：注意，最后一个目录名后面没有斜杠。 
//
// 示例 2： 
//
// 
//输入：path = "/../"
//输出："/"
//解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
// 
//
// 示例 3： 
//
// 
//输入：path = "/home//foo/"
//输出："/home/foo"
//解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
// 
//
// 示例 4： 
//
// 
//输入：path = "/a/./b/../../c/"
//输出："/c"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= path.length <= 3000 
// path 由英文字母，数字，'.'，'/' 或 '_' 组成。 
// path 是一个有效的 Unix 风格绝对路径。 
// 
//
// Related Topics 栈 字符串 👍 671 👎 0


package LeetCode.editor.cn;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author ldltd
 * @date 2023-12-24 00:58:53
 * @description 71.简化路径
 */
public class SimplifyPath{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new SimplifyPath().new Solution();
//		 System.out.println(solution.simplifyPath("/home//foo/"));
		 System.out.println(solution.simplifyPath("/a/./b/../../c/"));
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String simplifyPath1(String path) {
		Deque<String> stack=new ArrayDeque<>();
		int l=0,n=path.length()-1;
		//先去除末尾的‘/’
		while (n>0&&path.charAt(n)=='/'){
			n--;
		}
		while (l<=n){
			while (l<n&&path.charAt(l)=='/'){
				l++;
			}
			int r=l;
			//取单词，当第一次遇到‘/’时，再走到另一个非单词的位置
			while (r<=n&&path.charAt(r)!='/'){
				r++;
			}
			String str=path.substring(l,r);
			if(str.equals(".")){

			}else if(str.equals("..")){
				if(stack.size()>0)stack.pop();
			}else {
				stack.push("/"+str);
			}
			l=r+1;
		}
		StringBuffer res=new StringBuffer();
		while (!stack.isEmpty()){
			res.append(stack.pollLast());
		}
		return res.length()==0?"/":res.toString();
    }
	public String simplifyPath(String path) {
		Deque<String> d = new ArrayDeque<>();
		int n = path.length();
		for (int i = 1; i < n; ) {
			if (path.charAt(i) == '/' && ++i >= 0) continue;
			int j = i + 1;
			while (j < n && path.charAt(j) != '/') j++;
			String item = path.substring(i, j);
			if (item.equals("..")) {
				if (!d.isEmpty()) d.pollLast();
			} else if (!item.equals(".")) {
				d.addLast(item);
			}
			i = j;
		}
		StringBuilder sb = new StringBuilder();
		while (!d.isEmpty()) sb.append("/" + d.pollFirst());
		return sb.length() == 0 ? "/" : sb.toString();
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
